﻿using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace gt.framework.Utils
{
    public static class Validator
    {
        private const string DigitsPattern = @"^[0-9]+$";
        private const string EmailPattern = @"^\w+([-+.]\w+)*@(\w)+(\.)(com|com\.cn|net|cn|net\.cn|org|biz|info|gov|gov\.cn|edu|edu\.cn)$";
        private const string ChineseCharacterPattern = @"[\u4e00-\u9fa5]";

        /// <summary>
        /// 判断一个值是否能够转换成一个有效的数字。
        /// </summary>
        /// <param name="value">要判断的值。</param>
        /// <returns>如果 <paramref name="value"/> 是一个有效的数字，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsNumeric(object value)
        {
            double dbl;
            return double.TryParse(value.ToString(), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out dbl);
        }

        /// <summary>
        /// 判断一个值是否能够转换成一个整形数字。
        /// </summary>
        /// <param name="value">要判断的值。</param>
        /// <returns>如果 <paramref name="value"/> 是一个有效的整数，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsInteger(object value)
        {
            int i;
            return int.TryParse(value.ToString(), out i);
        }

        /// <summary>
        /// 判断一个值是否能够转换成一个Decimal。
        /// </summary>
        /// <param name="value">要判断的值。</param>
        /// <returns>如果 <paramref name="value"/> 是一个有效的Decimal，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsDecimal(object value)
        {
            decimal dec;
            return decimal.TryParse(value.ToString(), out dec);
        }

        /// <summary>
        /// 判断一个字符串是否仅由0-9的数字组成。
        /// </summary>
        /// <param name="value">要判断的字符串。</param>
        /// <returns>如果 <paramref name="value"/> 字符串是否仅由0-9的数字组成，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsDigits(string value)
        {
            Regex regex = new Regex(DigitsPattern);
            return regex.IsMatch(value);
        }

        /// <summary>
        /// 判断字符串是否有中文字符。
        /// </summary>
        /// <param name="value">要判断的字符串。</param>
        /// <returns>如果 <paramref name="value"/> 字符串包含中文，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool HasChineseCharacter(string value)
        {
            Regex regex = new Regex(ChineseCharacterPattern);
            return regex.IsMatch(value);
        }

        /// <summary>
        /// 判断字符串是否是Email地址。
        /// </summary>
        /// <param name="value">要判断的字符串。</param>
        /// <returns>如果 <paramref name="value"/> 字符串是Email地址，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsEmail(string value)
        {
            Regex regex = new Regex(EmailPattern);
            return regex.IsMatch(value);
        }

        /// <summary>
        /// 判断字符串是否是日期。
        /// </summary>
        /// <param name="value">要判断的字符串。</param>
        /// <returns>如果 <paramref name="value"/> 字符串是日期，则返回 <b>true</b>; 反之返回 <b>false</b>。</returns>
        public static bool IsDate(string value)
        {
            DateTime dt;
            return DateTime.TryParse(value, out dt);
        }
    }
}
